using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;
using System.Data;
using EntGuayasSLA.BL.Listas.Criterias;

namespace EntGuayasSLA.BL
{
    /// <summary>
    /// Estereotipo: ReadOnlyList
    /// Reponsabilidad: 
    /// Autor: Luis Cuenca
    /// Fecha: 5/29/2013 10:18:20 AM
    /// </summary>
    [Serializable]
    public class UsuarioLista : ReadOnlyListBase<UsuarioLista, UsuarioInfo>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(UsuarioLista), "Role");
        }

        #endregion

        #region Factory Methods

        public static UsuarioLista GetUsuarioLista(string filter)
        {
            return DataPortal.Fetch<UsuarioLista>(filter);
        }
        public static UsuarioLista GetUsuarioLista(UsuarioSingleCriteria filter)
        {
            return DataPortal.Fetch<UsuarioLista>(filter);
        }

        public static UsuarioLista GetUsuarioLista(UsuarioCriteria filter)
        {
            return DataPortal.Fetch<UsuarioLista>(filter);
        }
        //
        public static UsuarioLista GetUsuarioLista(UsuarioBuscadorCriteria filter)
        {
            return DataPortal.Fetch<UsuarioLista>(filter);
        }

        private UsuarioLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void DataPortal_Fetch(string criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values

            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_id", criteria), new Parametro("ec_identificacion", "") };
            DataSet datos = accesoDatos.EjecutarDataSet("\"LISTA_USUARIOS\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(UsuarioInfo.GetUsuarioInfo(items));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }
        //
        private void DataPortal_Fetch(UsuarioSingleCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values

            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_usr_estado", criteria.Estado),
                new Parametro("ec_rol_code", criteria.CodigoRol)
            };
            DataSet datos = accesoDatos.EjecutarDataSet("\"LISTA_USUARIOS_ESTADO\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(UsuarioInfo.GetUsuarioInfo(items));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }
        //
        private void DataPortal_Fetch(UsuarioCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values

            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> {
                new Parametro("ec_per_nombre", criteria.Nombre),
                new Parametro("ec_per_apellido", criteria.Apellido),
                new Parametro("ec_usr_estado", criteria.Estado),
                new Parametro("ec_rol_code", criteria.Rol)
            };
            DataSet datos = accesoDatos.EjecutarDataSet("\"LISTA_USUARIOS_CRITERIO\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(UsuarioInfo.GetUsuarioInfo(items));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }
        //
        private void DataPortal_Fetch(UsuarioBuscadorCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> {
                new Parametro("ec_per_identificacion", criteria.Identificacion),
                new Parametro("ec_per_nombre", criteria.Nombre),
                new Parametro("ec_per_apellido", criteria.Apellido),
                new Parametro("ec_usr_estado", criteria.Estado),
                new Parametro("ec_rol_code", criteria.RolCode)
            };
            DataSet datos = accesoDatos.EjecutarDataSet("\"LISTA_USUARIOS_NOMBRES\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(UsuarioInfo.GetUsuarioInfo(items));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }
        #endregion
    }
    /// <summary>
    /// Estereotipo: ReadOnlyChild
    /// Reponsabilidad: 
    /// Autor: Luis Cuenca
    /// Fecha: 5/29/2013 10:18:20 AM
    /// </summary>
    [Serializable]
    public class UsuarioInfo : ReadOnlyBase<UsuarioInfo>
    {
      

        #region Business Methods

        public Guid Id { get; internal set; }
        public string Login { get; internal set; }
        public string Clave { get; internal set; }
        public DateTime FechaCreacion { get; internal set; }
        public string Identificacion{ get; internal set; }
        public string Nombre   { get; internal set; }
        public string Apellido { get; internal set; }
        public string Direccion{ get; internal set; }
        public string Email { get; internal set; }
        public string Estado { get; internal set; }
        public Guid PersonaId { get; internal set; }
        public Guid RolId { get; internal set; }
        public Guid ParroquiaId { get; internal set; }
        public string Rol { get; internal set; }
        public string RolCodigo { get; internal set; }
        #endregion

        #region Factory Methods

        internal static UsuarioInfo GetUsuarioInfo(DataRow childData)
        {
            return DataPortal.FetchChild<UsuarioInfo>(childData);
        }

        private UsuarioInfo()
        { /* require use of factory methods */ }
        public UsuarioInfo(string usr_id, string per_nombre, string per_apellido)
        {
            Identificacion =usr_id;
            Nombre =per_nombre;
            Apellido = per_apellido;
        }

        public UsuarioInfo(string sIdent, string sNombr, string sApellid, string sEstado)
        {
            // TODO: Complete member initialization
            this.Identificacion = sIdent;
            this.Nombre = sNombr;
            this.Apellido = sApellid;
            this.Estado = sEstado;
        }
        #endregion

        #region Data Access

        private void Child_Fetch(DataRow childData)
        {

            Id = Guid.Parse(childData["usr_id"].ToString());
            Login = childData["usr_login"].ToString();
            Clave = childData["usr_clave"].ToString();
            FechaCreacion = DateTime.Parse(childData["usr_fecha_creacion"].ToString());

            if (childData.Table.Columns.Contains("per_identificacion"))
                Identificacion = childData["per_identificacion"].ToString();
            if (childData.Table.Columns.Contains("per_nombre"))
                Nombre = childData["per_nombre"].ToString();
            if (childData.Table.Columns.Contains("per_apellido"))
                Apellido = childData["per_apellido"].ToString();
            if (childData.Table.Columns.Contains("per_direccion"))
                Direccion = childData["per_direccion"].ToString();
            if (childData.Table.Columns.Contains("per_email"))
                Email = childData["per_email"].ToString();
            if (childData.Table.Columns.Contains("usr_estado"))
                Estado = childData["usr_estado"].ToString();
            if (childData.Table.Columns.Contains("per_id"))
                PersonaId = Guid.Parse(childData["per_id"].ToString());
            if (childData.Table.Columns.Contains("rol_id"))
                RolId = Guid.Parse(childData["rol_id"].ToString());
            if (childData.Table.Columns.Contains("par_id"))
                ParroquiaId = Guid.Parse(childData["par_id"].ToString());
            if (childData.Table.Columns.Contains("rol_nombre"))
                Rol = childData["rol_nombre"].ToString();
            if (childData.Table.Columns.Contains("rol_codigo"))
                RolCodigo = childData["rol_codigo"].ToString();
        }

        #endregion
    }
}
